﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Text;

namespace DataProcessor.Repository
{
    //public class DapperRepository<T> : IRepository<T> where T : class
    //{
    //    protected IDbConnection Conn { get; private set; }

    //    public DapperRepository()
    //    {
    //        Conn = DbConnectionFactory.CreateDbConnection();
    //    }

    //    public void SetDbConnection(IDbConnection conn)
    //    {
    //        Conn = conn;
    //    }

    //    public void Add(T entity)
    //    {
    //        Conn.Insert<T>(entity);
    //    }

    //    public void AddBatch(IEnumerable<T> entitys)
    //    {
    //        foreach (T entity in entitys)
    //        {
    //            Add(entity);
    //        }
    //    }

    //    public void Update(T entity)
    //    {
    //        Conn.Update(entity);
    //    }

    //    public void Delete(T entity)
    //    {
    //        Conn.Delete(entity);
    //    }

    //    public void Delete(string Id)
    //    {
    //        var entity = Get(Id);
    //        if (entity == null) return;

    //        Delete(entity);
    //    }

    //    public void Delete(int Id)
    //    {
    //        var entity = Get(Id);
    //        if (entity == null) return;

    //        Delete(entity);
    //    }
    //    public void Delete(Guid Id)
    //    {
    //        var entity = Get(Id);
    //        if (entity == null) return;

    //        Delete(entity);
    //    }

    //    public T Get(T entity)
    //    {
    //        return Conn.Get<T>(entity);
    //    }

    //    public T Get(Guid Id)
    //    {
    //        return Conn.Get<T>(Id);
    //    }

    //    public T Get(string Id)
    //    {
    //        return Conn.Get<T>(Id);
    //    }

    //    public T Get(int Id)
    //    {
    //        return Conn.Get<T>(Id);
    //    }

    //    public T Get(Expression<Func<T, bool>> func)
    //    {
    //        var linqToWhere = new LinqToWhere<T>();
    //        linqToWhere.Parse(func);

    //        return Conn.GetByFunc<T>(linqToWhere.Where, linqToWhere.KeyValuePairs);
    //    }

    //    public IEnumerable<T> GetAll()
    //    {
    //        return Conn.GetAll<T>();
    //    }

    //    public IEnumerable<T> GetList(Expression<Func<T, bool>> where = null, Expression<Func<T, bool>> order = null)
    //    {
    //        where = where.And(order);

    //        var linqToWhere = new LinqToWhere<T>();
    //        linqToWhere.Parse(where);

    //        return Conn.GetListByFunc<T>(linqToWhere.Where, linqToWhere.KeyValuePairs);
    //    }

    //    public Tuple<int, IEnumerable<T>> GetPage(Page page, Expression<Func<T, bool>> where = null, Expression<Func<T, bool>> order = null)
    //    {
    //        where = where.And(order);

    //        var linqToWhere = new LinqToWhere<T>();
    //        linqToWhere.Parse(where);

    //        var multi = Conn.GetPage<T>(page.PageIndex, page.PageSize, linqToWhere.Order, linqToWhere.Where, linqToWhere.KeyValuePairs);
    //        var count = multi.Read<int>().Single();
    //        var results = multi.Read<T>();

    //        return new Tuple<int, IEnumerable<T>>(count, results);
    //    }

    //    public long Count(Expression<Func<T, bool>> where = null)
    //    {
    //        var linqToWhere = new LinqToWhere<T>();
    //        linqToWhere.Parse(where);

    //        return Conn.Count<T>(linqToWhere.Where, linqToWhere.KeyValuePairs);
    //    }
    //}
}
